﻿using System;
using System.Collections.Generic;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using PhongMachTu.OConnection;
using PhongMachTu.OModel;

namespace PhongMachTu.OForm
{
    public partial class FormMedicine : Form
    {
        public FormMedicine()
        {
            InitializeComponent();
        }

        private void clearAllField()
        {
            txtGiaTien.Text = string.Empty;
            txtTenThuoc.Text = string.Empty;
            cmbxCachDung.SelectedIndex = 0;
            cmbxCachDung.Update();
            cmbxDv.SelectedIndex = 0;
            cmbxDv.Update();
            txtDv.Text = string.Empty;
            txtCachDung.Text = string.Empty;
        }

        public void refreshDsDv()
        {
            ArrayList units = DataManipulate.getAllMedicineUnit();
            
            dsUnit.Items.Clear();
            cmbxDv.Items.Clear();
            cmbxDv.Items.Add("");

            if (units != null)
            {
                foreach (MedicineUnit unit in units)
                {
                    ListViewItem lvi = new ListViewItem(unit.Name);
                    lvi.Tag = unit;
                    dsUnit.Items.Add(lvi);
                    cmbxDv.Items.Add(unit.Name);
                }
            }
        }

        public void refreshDsMedicine()
        {
            ArrayList medicines = DataManipulate.getAllMedicine();
            dsMedicine.Items.Clear();
            if (medicines != null)
            {
                foreach (Medicine medicine in medicines)
                {
                    ListViewItem lvi = new ListViewItem(medicine.Name);
                    lvi.Tag = medicine;
                    dsMedicine.Items.Add(lvi);
                }
            }
        }

        public void refreshDsUsing()
        {
            ArrayList usings = DataManipulate.getAllMedicineUsing();
            
            dsUsing.Items.Clear();
            cmbxCachDung.Items.Clear();
            cmbxCachDung.Items.Add("");

            if (usings != null)
            {
                foreach (MedicineUsing ausing in usings)
                {
                    ListViewItem lvi = new ListViewItem(ausing.Name);
                    lvi.Tag = ausing;
                    dsUsing.Items.Add(lvi);
                    cmbxCachDung.Items.Add(ausing.Name);
                }
            }
        }

        public void refreshAll()
        {
            ArrayList medicines = DataManipulate.getAllMedicine();
            ArrayList units = DataManipulate.getAllMedicineUnit();
            ArrayList usings = DataManipulate.getAllMedicineUsing();

            dsMedicine.Items.Clear();
            dsUnit.Items.Clear();
            dsUsing.Items.Clear();
            cmbxDv.Items.Clear();
            cmbxCachDung.Items.Clear();
            cmbxDv.Items.Add("");
            cmbxCachDung.Items.Add("");
            
            cmbxDv.DisplayMember = "Name";
            cmbxDv.ValueMember = "Id";

            cmbxCachDung.DisplayMember = "Name";
            cmbxCachDung.ValueMember = "Id";

            if (medicines != null)
            {
                foreach (Medicine medicine in medicines)
                {
                    ListViewItem lvi = new ListViewItem(medicine.Name);
                    lvi.Tag = medicine;

                    dsMedicine.Items.Add(lvi);
                }
            }

            if (units != null)
            {
                foreach (MedicineUnit unit in units)
                {
                    ListViewItem lvi = new ListViewItem(unit.Name);
                    lvi.Tag = unit;

                    dsUnit.Items.Add(lvi);

                    cmbxDv.Items.Add(unit.Name);
                }
            }

            if (usings != null)
            {
                foreach (MedicineUsing aUsing in usings)
                {
                    ListViewItem lvi = new ListViewItem(aUsing.Name);
                    lvi.Tag = aUsing;

                    dsUsing.Items.Add(lvi);

                    cmbxCachDung.Items.Add(aUsing.Name);
                }
            }
        }

        private void FormMedicine_FormClosing(object sender, FormClosingEventArgs e)
        {
            e.Cancel = true;
            clearAllField();
            FormManager.medicineForm.Hide();
            FormManager.mainForm.Show();
            FormManager.mainForm.Focus();
        }

        private void dsUnit_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (OSession.isLoggedIn())
            {
                if (dsUnit.SelectedItems.Count == 0) return;
                ListViewItem selectedLvi = dsUnit.SelectedItems[0];
                MedicineUnit unit = (MedicineUnit)selectedLvi.Tag;

                txtDv.Text = unit.Name;
            }
            else
            {
                FormManager.medicineForm.Hide();
                FormManager.loginForm.Show();
                MessageBox.Show("Quá thời gian chờ cho phép, vui lòng đăng nhập lại");
            }
        }

        private void dsUsing_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (OSession.isLoggedIn())
            {
                if (dsUsing.SelectedItems.Count == 0) return;
                ListViewItem selectedLvi = dsUsing.SelectedItems[0];
                MedicineUsing ausing = (MedicineUsing)selectedLvi.Tag;

                txtCachDung.Text = ausing.Name;
            }
            else
            {
                FormManager.medicineForm.Hide();
                FormManager.loginForm.Show();
                MessageBox.Show("Quá thời gian chờ cho phép, vui lòng đăng nhập lại");
            }
        }

        private void dsMedicine_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (OSession.isLoggedIn())
            {
                if (dsMedicine.SelectedItems.Count == 0) return;
                ListViewItem selectedLvi = dsMedicine.SelectedItems[0];
                Medicine medicine = (Medicine)selectedLvi.Tag;

                txtTenThuoc.Text = medicine.Name;
                txtGiaTien.Text = medicine.Price.ToString();
                cmbxDv.SelectedItem = medicine.Unit.Name;
                cmbxCachDung.SelectedItem = medicine.Using.Name;
            }
            else
            {
                FormManager.medicineForm.Hide();
                FormManager.loginForm.Show();
                MessageBox.Show("Quá thời gian chờ cho phép, vui lòng đăng nhập lại");
            }
        }

        private void btnAddUnit_Click(object sender, EventArgs e)
        {
            if (OSession.isLoggedIn())
            {
                string input = txtDv.Text;
                if (input == "")
                {
                    MessageBox.Show("Vui lòng nhập cách dùng");
                    return;
                }
                if (!DataManipulate.isUnitExist(input))
                {
                    if (DataManipulate.addUnit(input))
                    {
                        MessageBox.Show("Thêm đơn vị thành công");
                        
                        //refresh ListView Unit va Combobox Unit
                        refreshDsDv();
                        //Cap nhat selected medicine ComboBox Unit
                        if (dsMedicine.SelectedItems.Count == 0) return;
                        ListViewItem selectedLvi = dsMedicine.SelectedItems[0];
                        Medicine medicine = (Medicine)selectedLvi.Tag;
                        cmbxDv.SelectedItem = medicine.Unit.Name;
                        ///////////////////////////////////////////////
                    }
                    else
                    {
                        MessageBox.Show("Thêm đơn vị thất bại");
                    }
                }
                else
                {
                    MessageBox.Show("Tên đơn vị đã tồn tại");
                }
            }
            else
            {
                FormManager.medicineForm.Hide();
                FormManager.loginForm.Show();
                MessageBox.Show("Quá thời gian chờ cho phép, vui lòng đăng nhập lại");
            }
        }

        private void btnUpdateUnit_Click(object sender, EventArgs e)
        {
            if (OSession.isLoggedIn())
            {
                if (dsUnit.SelectedItems.Count == 0) return;
                ListViewItem selectedLvi = dsUnit.SelectedItems[0];
                MedicineUnit unit = (MedicineUnit)selectedLvi.Tag;
                string oldname = unit.Name;
                unit.Name = txtDv.Text;

                    if (DataManipulate.updateUnit(unit))
                    {
                        MessageBox.Show("Cập nhật đơn vị thành công");
                        //refresh ListView Unit va Combobox Unit
                        refreshDsDv();
                        //Cap nhat selected medicine ComboBox Unit
                        if (dsMedicine.SelectedItems.Count == 0) return;
                        int selectedIndexMedicine = dsMedicine.SelectedIndices[0];
                        refreshDsMedicine();
                        dsMedicine.Items[selectedIndexMedicine].Selected = true;
                        ///////////////////////////////////////////////
                    }
                    else
                    {
                        unit.Name = oldname;
                        MessageBox.Show("Cập nhật đơn vị thất bại");
                    }
            }
            else
            {
                FormManager.medicineForm.Hide();
                FormManager.loginForm.Show();
                MessageBox.Show("Quá thời gian chờ cho phép, vui lòng đăng nhập lại");
            }
        }

        private void btnDelUnit_Click(object sender, EventArgs e)
        {
            if (OSession.isLoggedIn())
            {
                if (dsUnit.SelectedItems.Count == 0) return;
                ListViewItem selectedLvi = dsUnit.SelectedItems[0];
                MedicineUnit unit = (MedicineUnit)selectedLvi.Tag;

                if (DataManipulate.isUnitDeletable(unit))
                {
                    if (DataManipulate.deleteUnit(unit))
                    {
                        MessageBox.Show("Xóa đơn vị thành công");
                        //refresh ListView Unit va Combobox Unit
                        refreshDsDv();
                        //Cap nhat selected medicine ComboBox Unit
                        if (dsMedicine.SelectedItems.Count == 0) return;
                        ListViewItem curSelectedMedicine = dsMedicine.SelectedItems[0];
                        Medicine medicine = (Medicine)curSelectedMedicine.Tag;
                        cmbxDv.SelectedItem = medicine.Unit.Name;
                        ///////////////////////////////////////////////
                    }
                    else
                    {
                        MessageBox.Show("Xóa đơn vị thất bại");
                    }
                }
                else
                {
                    MessageBox.Show("Đơn vị được sử dụng, không thể xóa");
                }
            }
            else
            {
                FormManager.medicineForm.Hide();
                FormManager.loginForm.Show();
                MessageBox.Show("Quá thời gian chờ cho phép, vui lòng đăng nhập lại");
            }
        }

        private void btnAddUsing_Click(object sender, EventArgs e)
        {
            if (OSession.isLoggedIn())
            {
                string input = txtCachDung.Text;
                if (input == "")
                {
                    MessageBox.Show("Vui lòng nhập cách dùng");
                    return;
                }
                if (!DataManipulate.isUsingExist(input))
                {
                    if (DataManipulate.addUsing(input))
                    {
                        MessageBox.Show("Thêm cách dùng thành công");

                        //refresh ListView Using va Combobox Using
                        refreshDsUsing();
                        //Cap nhat selected medicine ComboBox Unit
                        if (dsMedicine.SelectedItems.Count == 0) return;
                        ListViewItem selectedLvi = dsMedicine.SelectedItems[0];
                        Medicine medicine = (Medicine)selectedLvi.Tag;
                        cmbxCachDung.SelectedItem = medicine.Using.Name;
                        ///////////////////////////////////////////////
                    }
                    else
                    {
                        MessageBox.Show("Thêm cách dùng thất bại");
                    }
                }
                else
                {
                    MessageBox.Show("Tên cách dùng đã tồn tại");
                }
            }
            else
            {
                FormManager.medicineForm.Hide();
                FormManager.loginForm.Show();
                MessageBox.Show("Quá thời gian chờ cho phép, vui lòng đăng nhập lại");
            }
        }

        private void btnUpdateUsing_Click(object sender, EventArgs e)
        {
            if (OSession.isLoggedIn())
            {
                if (dsUsing.SelectedItems.Count == 0) return;
                ListViewItem selectedLvi = dsUsing.SelectedItems[0];
                MedicineUsing ausing = (MedicineUsing)selectedLvi.Tag;
                string oldname = ausing.Name;
                ausing.Name = txtCachDung.Text;

                if (DataManipulate.updateUsing(ausing))
                {
                    MessageBox.Show("Cập nhật cách dùng thành công");
                    //refresh ListView Using va Combobox Using
                    refreshDsUsing();
                    //Cap nhat selected medicine ComboBox Using
                    if (dsMedicine.SelectedItems.Count == 0) return;
                    int selectedIndexMedicine = dsMedicine.SelectedIndices[0];
                    refreshDsMedicine();
                    dsMedicine.Items[selectedIndexMedicine].Selected = true;
                    ///////////////////////////////////////////////
                }
                else
                {
                    ausing.Name = oldname;
                    MessageBox.Show("Cập nhật đơn vị thất bại");
                }
            }
            else
            {
                FormManager.medicineForm.Hide();
                FormManager.loginForm.Show();
                MessageBox.Show("Quá thời gian chờ cho phép, vui lòng đăng nhập lại");
            }
        }

        private void btnDelUsing_Click(object sender, EventArgs e)
        {
            if (OSession.isLoggedIn())
            {
                if (dsUsing.SelectedItems.Count == 0) return;
                ListViewItem selectedLvi = dsUsing.SelectedItems[0];
                MedicineUsing ausing = (MedicineUsing)selectedLvi.Tag;

                if (DataManipulate.isUsingDeletable(ausing))
                {
                    if (DataManipulate.deleteUsing(ausing))
                    {
                        MessageBox.Show("Xóa cách dùng thành công");
                        //refresh ListView Using va Combobox Using
                        refreshDsUsing();
                        //Cap nhat selected medicine ComboBox Using
                        if (dsMedicine.SelectedItems.Count == 0) return;
                        ListViewItem curSelectedMedicine = dsMedicine.SelectedItems[0];
                        Medicine medicine = (Medicine)curSelectedMedicine.Tag;
                        cmbxCachDung.SelectedItem = medicine.Using.Name;
                        ///////////////////////////////////////////////
                    }
                    else
                    {
                        MessageBox.Show("Xóa cách dùng thất bại");
                    }
                }
                else
                {
                    MessageBox.Show("Cách dùng được sử dụng, không thể xóa");
                }
            }
            else
            {
                FormManager.medicineForm.Hide();
                FormManager.loginForm.Show();
                MessageBox.Show("Quá thời gian chờ cho phép, vui lòng đăng nhập lại");
            }
        }

        private void btnAddMedicine_Click(object sender, EventArgs e)
        {
            if (OSession.isLoggedIn())
            {
                string name = txtTenThuoc.Text;
                if (name == "")
                {
                    MessageBox.Show("Vui lòng nhập tên thuốc");
                    return;
                }
                if (DataManipulate.isMedicineExist(name))
                {
                    MessageBox.Show("Tên thuốc đã tồn tại");
                    return;
                }

                string giatien = txtGiaTien.Text;
                if (giatien == "")
                {
                    MessageBox.Show("Vui lòng nhập giá thuốc");
                    return;
                }
                double giatienNumb = 0;
                if (!Double.TryParse(giatien, out giatienNumb))
                {
                    MessageBox.Show("Giá tiền phải là kiểu số");
                    return;
                }

                string unitName = cmbxDv.SelectedItem.ToString();
                string usingName = cmbxCachDung.SelectedItem.ToString();

                if (unitName == "")
                {
                    MessageBox.Show("Vui lòng chọn đơn vị thuốc");
                    return;
                }
                if (usingName == "")
                {
                    MessageBox.Show("Vui lòng cách dùng cho vị thuốc");
                    return;
                }

                MedicineUnit oUnit = DataManipulate.getUnitByName(unitName);
                MedicineUsing oUsing = DataManipulate.getUsingByName(usingName);

                Medicine medicine = new Medicine();
                medicine.Name = name;
                medicine.Price = giatienNumb;
                medicine.Unit = oUnit;
                medicine.Using = oUsing;

                if (DataManipulate.addMedicine(medicine))
                {
                    MessageBox.Show("Thêm thuốc mới thành công");
                    refreshDsMedicine();
                }
                else
                {
                    MessageBox.Show("Thêm thuốc mới thất bại");
                }
            }
            else
            {
                FormManager.medicineForm.Hide();
                FormManager.loginForm.Show();
                MessageBox.Show("Quá thời gian chờ cho phép, vui lòng đăng nhập lại");
            }
        }

        private void btnUpdateMedicine_Click(object sender, EventArgs e)
        {
            if(OSession.isLoggedIn())
            {
                if (dsMedicine.SelectedItems.Count == 0) return;
                ListViewItem selectedLvi = dsMedicine.SelectedItems[0];
                Medicine medicine = (Medicine)selectedLvi.Tag;

                string name = txtTenThuoc.Text;
                if (name == "")
                {
                    MessageBox.Show("Vui lòng nhập tên thuốc");
                    return;
                }

                string giatien = txtGiaTien.Text;
                if (giatien == "")
                {
                    MessageBox.Show("Vui lòng nhập giá thuốc");
                    return;
                }
                double giatienNumb = 0;
                if (!Double.TryParse(giatien, out giatienNumb))
                {
                    MessageBox.Show("Giá tiền phải là kiểu số");
                    return;
                }

                string unitName = cmbxDv.SelectedItem.ToString();
                string usingName = cmbxCachDung.SelectedItem.ToString();

                if (unitName == "")
                {
                    MessageBox.Show("Vui lòng chọn đơn vị thuốc");
                    return;
                }
                if (usingName == "")
                {
                    MessageBox.Show("Vui lòng cách dùng cho vị thuốc");
                    return;
                }

                MedicineUnit oUnit = DataManipulate.getUnitByName(unitName);
                MedicineUsing oUsing = DataManipulate.getUsingByName(usingName);

                medicine.Name = name;
                medicine.Price = giatienNumb;
                medicine.Unit = oUnit;
                medicine.Using = oUsing;

                if (DataManipulate.updateMedicine(medicine))
                {
                    MessageBox.Show("Cập nhật thông tin thuốc thành công");
                    refreshDsMedicine();
                }
                else
                {
                    MessageBox.Show("Cập nhật thông tin thuốc thất bại");
                }
            }
            else
            {
                FormManager.medicineForm.Hide();
                FormManager.loginForm.Show();
                MessageBox.Show("Quá thời gian chờ cho phép, vui lòng đăng nhập lại");
            }
        }

        private void btnDelMedicine_Click(object sender, EventArgs e)
        {
            if (OSession.isLoggedIn())
            {
                if (dsMedicine.SelectedItems.Count == 0) return;
                ListViewItem selectedLvi = dsMedicine.SelectedItems[0];
                Medicine medicine = (Medicine)selectedLvi.Tag;

                if (DataManipulate.isMedicineDeletable(medicine))
                {
                    if (DataManipulate.deleteMedicine(medicine))
                    {
                        MessageBox.Show("Xóa thuốc thành công");
                        refreshDsMedicine();
                    }
                    else
                    {
                        MessageBox.Show("Xóa thuốc thất bại");
                    }
                }
                else
                {
                    MessageBox.Show("Không thể xóa");
                }
            }
            else
            {
                FormManager.medicineForm.Hide();
                FormManager.loginForm.Show();
                MessageBox.Show("Quá thời gian chờ cho phép, vui lòng đăng nhập lại");
            }
        }
    
            
    }
}
